package com.shinbada.core.security.shiro;

import com.shinbada.common.Common;
import com.shinbada.modules.sys.entity.Menu;
import com.shinbada.modules.sys.entity.Role;
import com.shinbada.modules.sys.entity.User;
import com.shinbada.modules.sys.utils.UserUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.authz.SimpleAuthorizationInfo;

import java.util.List;
import java.util.Set;

/**
 * 用户权限码获取工具
 *
 * @author initcap
 * @date Created in 2021/2/18 09:56.
 */
public class PermissionsUtil {

    /**
     * 根据登录名判断用户是否具有指定权限
     *
     * @param loginName  登录名
     * @param permission 权限码
     * @return true 具有
     */
    public static boolean loginNameContainsPermission(String loginName, String permission) {
        return loginNamePermissions(loginName).contains(permission);
    }

    /**
     * 根据用户主键判断是否具有指定权限
     *
     * @param userId     用户主键
     * @param permission 权限码
     * @return true 具有
     */
    public static boolean userIdContainsPermission(String userId, String permission) {
        return userIdPermissions(userId).contains(permission);
    }

    /**
     * 获取当前用户的所有权限
     *
     * @return 权限集合
     */
    public static Set<String> currentUserPermissions() {
        return loginNamePermissions(JWTUtil.getLoginName(UserUtils.getToken()));
    }

    /**
     * 根据登录名获取权限
     *
     * @param loginName 登录名
     * @return 权限集合
     */
    public static Set<String> loginNamePermissions(String loginName) {
        return userPermissions(UserUtils.getByLoginName(loginName));
    }

    /**
     * 根据用户主键获取权限
     *
     * @param userId 用户主键
     * @return 权限集合
     */
    public static Set<String> userIdPermissions(String userId) {
        return userPermissions(UserUtils.get(userId));
    }

    /**
     * 根据用户信息获取权限
     *
     * @param user 用户信息
     * @return 权限集合
     */
    public static Set<String> userPermissions(User user) {
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        if (user != null) {
            List<Menu> list = UserUtils.getMenuList();
            for (Menu menu : list) {
                if (StringUtils.isNotBlank(menu.getPermission())) {
                    // 添加基于Permission的权限信息
                    for (String permission : StringUtils.split(menu.getPermission(), Common.Dict.PLATFORM_SPLIT_SEPARATOR)) {
                        info.addStringPermission(permission);
                    }
                }
            }
            // 添加用户权限
            info.addStringPermission("user");
            // 添加用户角色信息
            for (Role role : user.getRoleList()) {
                info.addRole(role.getName());
            }
        }
        return info.getStringPermissions();
    }

}
